home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2004 April
/
Gamestar_61_2004-04_dvdb.iso
/
DVDStar
/
Editace
/
hltp.exe
/
{app}
/
Source Code
/
Zoners Half-Life Tools
/
common
/
cmdlib.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-12-24
|
9KB
|
436 lines
#ifdef SYSTEM_WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#include "cmdlib.h"
#include "messages.h"
#include "hlassert.h"
#include "blockmem.h"
#include "log.h"
#ifdef SYSTEM_POSIX
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#endif
#define PATHSEPARATOR(c) ((c) == '\\' || (c) == '/')
/*
* ================
* I_FloatTime
* ================
*/
double I_FloatTime()
{
#ifdef SYSTEM_WIN32
FILETIME ftime;
double rval;
GetSystemTimeAsFileTime(&ftime);
rval = ftime.dwLowDateTime;
rval += ((__int64)ftime.dwHighDateTime) << 32;
return (rval / 10000000.0);
#endif
#ifdef SYSTEM_POSIX
struct timeval tp;
struct timezone tzp;
static int secbase;
gettimeofday(&tp, &tzp);
if (!secbase)
{
secbase = tp.tv_sec;
return tp.tv_usec / 1000000.0;
}
return (tp.tv_sec - secbase) + tp.tv_usec / 1000000.0;
#endif
}
#ifdef SYSTEM_POSIX
char* strupr(char* string)
{
int i;
int len = strlen(string);
for (i = 0; i < len; i++)
{
string[i] = toupper(string[i]);
}
return string;
}
char* strlwr(char* string)
{
int i;
int len = strlen(string);
for (i = 0; i < len; i++)
{
string[i] = tolower(string[i]);
}
return string;
}
#endif
// Case Insensitive substring matching
const char* stristr(const char* const string, const char* const substring)
{
char* string_copy;
char* substring_copy;
const char* match;
string_copy = strdup(string);
strlwr(string_copy);
substring_copy = strdup(substring);
strlwr(substring_copy);
match = strstr(string_copy, substring_copy);
if (match)
{
match = (string + (match - string_copy));
}
free(string_copy);
free(substring_copy);
return match;
}
char* FlipSlashes(char* string)
{
while (*string)
{
if (PATHSEPARATOR(*string))
{
*string = SYSTEM_SLASH_CHAR;
}
string++;
}
return string;
}
void DefaultExtension(char* path, const char* extension)
{
char* src;
//
// if path doesn't have a .EXT, append extension
// (extension should include the .)
//
src = path + strlen(path) - 1;
while (!PATHSEPARATOR(*src) && src != path)
{
if (*src == '.')
return; // it has an extension
src--;
}
strcat(path, extension);
}
void StripFilename(char* path)
{
int length;
length = strlen(path) - 1;
while (length > 0 && !PATHSEPARATOR(path[length]))
length--;
path[length] = 0;
}
void StripExtension(char* path)
{
int length;
length = strlen(path) - 1;
while (length > 0 && path[length] != '.')
{
length--;
if (path[length] == '/')
return; // no extension
}
if (length)
path[length] = 0;
}
/*
* ====================
* Extract file parts
* ====================
*/
void ExtractFilePath(const char* const path, char* dest)
{
hlassert (path != dest);
const char* src;
src = path + strlen(path) - 1;
//
// back up until a \ or the start
//
while (src != path && !PATHSEPARATOR(*(src - 1)))
src--;
memcpy(dest, path, src - path);
dest[src - path] = 0;
}
void ExtractFile(const char* const path, char* dest)
{
hlassert (path != dest);
const char* src;
src = path + strlen(path) - 1;
while (src != path && !PATHSEPARATOR(*(src - 1)))
src--;
while (*src)
{
*dest++ = *src++;
}
*dest = 0;
}
void ExtractFileBase(const char* const path, char* dest)
{
hlassert (path != dest);
const char* src;
src = path + strlen(path) - 1;
//
// back up until a \ or the start
//
while (src != path && !PATHSEPARATOR(*(src - 1)))
src--;
while (*src && *src != '.')
{
*dest++ = *src++;
}
*dest = 0;
}
void ExtractFileExtension(const char* const path, char* dest)
{
hlassert (path != dest);
const char* src;
src = path + strlen(path) - 1;
//
// back up until a . or the start
//
while (src != path && *(src - 1) != '.')
src--;
if (src == path)
{
*dest = 0; // no extension
return;
}
strcpy(dest, src);
}
/*
* ============================================================================
*
* BYTE ORDER FUNCTIONS
*
* ============================================================================
*/
#ifdef WORDS_BIGENDIAN
short LittleShort(const short l)
{
byte b1, b2;
b1 = l & 255;
b2 = (l >> 8) & 255;
return (b1 << 8) + b2;
}
short BigShort(const short l)
{
return l;
}
int LittleLong(const int l)
{
byte b1, b2, b3, b4;
b1 = l & 255;
b2 = (l >> 8) & 255;
b3 = (l >> 16) & 255;
b4 = (l >> 24) & 255;
return ((int)b1 << 24) + ((int)b2 << 16) + ((int)b3 << 8) + b4;
}
int BigLong(const int l)
{
return l;
}
float LittleFloat(const float l)
{
union
{
byte b[4];
float f;
}
in , out;
in.f = l;
out.b[0] = in.b[3];
out.b[1] = in.b[2];
out.b[2] = in.b[1];
out.b[3] = in.b[0];
return out.f;
}
float BigFloat(const float l)
{
return l;
}
#else // Little endian (Intel, etc)
short BigShort(const short l)
{
byte b1, b2;
b1 = (byte) (l & 255);
b2 = (byte) ((l >> 8) & 255);
return (short)((b1 << 8) + b2);
}
short LittleShort(const short l)
{
return l;
}
int BigLong(const int l)
{
byte b1, b2, b3, b4;
b1 = (byte) (l & 255);
b2 = (byte) ((l >> 8) & 255);
b3 = (byte) ((l >> 16) & 255);
b4 = (byte) ((l >> 24) & 255);
return ((int)b1 << 24) + ((int)b2 << 16) + ((int)b3 << 8) + b4;
}
int LittleLong(const int l)
{
return l;
}
float BigFloat(const float l)
{
union
{
byte b[4];
float f;
}
in , out;
in.f = l;
out.b[0] = in.b[3];
out.b[1] = in.b[2];
out.b[2] = in.b[1];
out.b[3] = in.b[0];
return out.f;
}
float LittleFloat(const float l)
{
return l;
}
#endif
//=============================================================================
bool CDECL safe_snprintf(char* const dest, const size_t count, const char* const args, ...)
{
size_t amt;
va_list argptr;
hlassert(count > 0);
va_start(argptr, args);
amt = vsnprintf(dest, count, args, argptr);
va_end(argptr);
// truncated (bad!, snprintf doesn't null terminate the string when this happens)
if (amt == count)
{
dest[count - 1] = 0;
return false;
}
return true;
}
bool safe_strncpy(char* const dest, const char* const src, const size_t count)
{
return safe_snprintf(dest, count, "%s", src);
}
bool safe_strncat(char* const dest, const char* const src, const size_t count)
{
if (count)
{
strncat(dest, src, count);
dest[count - 1] = 0; // Ensure it is null terminated
return true;
}
else
{
Warning("safe_strncat passed empty count");
return false;
}
}
bool TerminatedString(const char* buffer, const int size)
{
int x;
for (x = 0; x < size; x++, buffer++)
{
if ((*buffer) == 0)
{
return true;
}
}
return false;
}